# "interface"-ish
import urllib,re,time
class Downloader(object):
	'''
	De interface voor downloaders, het bevat een getDownloadLink die een absolute link zal moeten teruggeven en getFirstResult die instaat voor het teruggeven van een liedje met een zoekterm.
	'''
	def __init__(self):
		pass

	def getDownloadLink(self, id):
		'''
		Fetch de absolute link van een audio-bestand en geef deze terug
		'''
		pass

	def getFirstResult(self,keywords):
		'''
		Gebruik het platform zijn zoekfunctie om een video/clip te vinden en geeft deze terug
		'''
		pass

	def download(self,keywords):
		'''
		Download de absolute link. Functie ongebruikt op het moment wegens streaming capaciteiten.
		'''
		import Common

		result = self.getFirstResult(keywords)
		if result != '':
			d = Common.DownloadVideo(self.getDownloadLink(result),str(int(time.time)))
			d.start()
			return d
		else:
			return False

# Youtube downloader class
class Youtube(Downloader):
	'''
	De downloader zijn functie voor Youtube
	'''
	def getFirstResult(self,keywords):
		ua = urllib.urlopen('http://gdata.youtube.com/feeds/base/videos?q='+urllib.quote(keywords)+'&alt=rss&client=ytapi-youtube-search&v=2')
		data = ua.read()
		if 'pubDate' in data:
			iteration1 = data.split('</guid><pubDate>')
			iteration2 = iteration1[0].split(':video:')
			videoId = iteration2[1]
			# print videoId
			self.videoId = videoId

			title_iteration1 = iteration1[1].split('</title>')
			title_iteration2 = title_iteration1[0].split('<title>')
			title = title_iteration2[1]
			# print "Title: " + title
			self.title = title

			duration_iteration1 = data.split('font-weight: bold;"&gt;')
			duration_iteration2 = duration_iteration1[2].split('&lt;/span')
			duration = duration_iteration2[0]

			self.duration = duration
			# print "Duration: " + duration
			# runHooks('getFirstResult_after', title=title, duration=duration, videoId=videoId)
			return videoId
		else:
			return "iMpXAknykeg"

	def getDownloadLink(self, idd):

		# print idd
		url = ''
		sig = ''
		ua = urllib.urlopen('http://www.youtube.com/get_video_info?&video_id='+idd+'&el=detailpage&ps=default&eurl=&gl=US&hl=en')
		firstIteration = ua.read().split('&')
		for i in firstIteration:
			if re.match('url_encoded_fmt_stream_map', i):
				# print "url_enc..."
				i.replace('url_encoded_fmt_stream_map=','')
				d = urllib.unquote(i)
				secondIteration = d.split(',')
				for j in secondIteration:
					thirdIteration = j.split('&')
					if 'large' in j or 'medium' in j:
						for z in thirdIteration:
							if re.match('url=',z):
								url = z.replace('url=','')

							if re.match('sig=',z):
								sig = z.replace('sig=','')
		return urllib.unquote(url) + '&signature=' + sig

class YoutubeLink(Youtube):
	'''
	Speciaal voor wanneer men Youtube links wilt gebruiken!
	'''
	def getFirstResult(self,link):
		#Youtube regex
		#^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$
		#http://stackoverflow.com/a/10315969/1173237
		match = re.match('^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$',link)
		if match:
			return match.group(1)
		else:
			return -1